]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
keyboard: Add keyboard model configuration support
authorLeorize <leorize+oss@disroot.org>
Thu, 1 Dec 2022 07:11:57 +0000 (07:11 +0000)
committerMarge Bot <marge-bot@gnome.org>
Fri, 19 Jan 2024 14:18:38 +0000 (14:18 +0000)
Enables the use of a new `xkb-model` dconf key to let user configure
their desired keyboard model.

Also included is additional glue for respecting X11Model set at the
system level (ie. via `localectl`).

For simplicity, this assumes the use of one global keyboard model.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2583>

js/misc/keyboardManager.js
js/ui/status/keyboard.js

index ed2bdddc895c0747656a6e8776bd88086140a57e..d63bd1fec760b99c076dafe5a9adb65cc9ba82ed 100644 (file)
@@ -60,15 +60,17 @@ class KeyboardManager {
     _applyLayoutGroup(group) {
         let options = this._buildOptionsString();
         let [layouts, variants] = this._buildGroupStrings(group);
+        let model = this._xkbModel;
 
         if (this._currentKeymap &&
             this._currentKeymap.layouts === layouts &&
             this._currentKeymap.variants === variants &&
-            this._currentKeymap.options === options)
+            this._currentKeymap.options === options &&
+            this._currentKeymap.model === model)
             return;
 
-        this._currentKeymap = {layouts, variants, options};
-        global.backend.set_keymap(layouts, variants, options);
+        this._currentKeymap = {layouts, variants, options, model};
+        global.backend.set_keymap(layouts, variants, options, model);
     }
 
     _applyLayoutGroupIndex(idx) {
@@ -158,6 +160,10 @@ class KeyboardManager {
         this._xkbOptions = options;
     }
 
+    setKeyboardModel(model) {
+        this._xkbModel = model;
+    }
+
     _buildOptionsString() {
         let options = this._xkbOptions.join(',');
         return options;
index e285eb4950c4ca0dd6e282798a366b48d07e773f..cfc0a01f6b3bb2a1d2d62184e701aa896a374ae3 100644 (file)
@@ -161,6 +161,10 @@ class InputSourceSettings extends Signals.EventEmitter {
         this.emit('keyboard-options-changed');
     }
 
+    _emitKeyboardModelChanged() {
+        this.emit('keyboard-model-changed');
+    }
+
     _emitPerWindowChanged() {
         this.emit('per-window-changed');
     }
@@ -198,6 +202,7 @@ class InputSourceSystemSettings extends InputSourceSettings {
         this._layouts = '';
         this._variants = '';
         this._options = '';
+        this._model = '';
 
         this._reload();
 
@@ -229,6 +234,7 @@ class InputSourceSystemSettings extends InputSourceSettings {
         const layouts = props['X11Layout'].unpack();
         const variants = props['X11Variant'].unpack();
         const options = props['X11Options'].unpack();
+        const model = props['X11Model'].unpack();
 
         if (layouts !== this._layouts ||
             variants !== this._variants) {
@@ -240,6 +246,10 @@ class InputSourceSystemSettings extends InputSourceSettings {
             this._options = options;
             this._emitKeyboardOptionsChanged();
         }
+        if (model !== this._model) {
+            this._model = model;
+            this._emitKeyboardModelChanged();
+        }
     }
 
     get inputSources() {
@@ -259,6 +269,10 @@ class InputSourceSystemSettings extends InputSourceSettings {
     get keyboardOptions() {
         return this._options.split(',');
     }
+
+    get keyboardModel() {
+        return this._model;
+    }
 }
 
 class InputSourceSessionSettings extends InputSourceSettings {
@@ -269,11 +283,13 @@ class InputSourceSessionSettings extends InputSourceSettings {
         this._KEY_INPUT_SOURCES = 'sources';
         this._KEY_MRU_SOURCES = 'mru-sources';
         this._KEY_KEYBOARD_OPTIONS = 'xkb-options';
+        this._KEY_KEYBOARD_MODEL = 'xkb-model';
         this._KEY_PER_WINDOW = 'per-window';
 
         this._settings = new Gio.Settings({schema_id: this._DESKTOP_INPUT_SOURCES_SCHEMA});
         this._settings.connect(`changed::${this._KEY_INPUT_SOURCES}`, this._emitInputSourcesChanged.bind(this));
         this._settings.connect(`changed::${this._KEY_KEYBOARD_OPTIONS}`, this._emitKeyboardOptionsChanged.bind(this));
+        this._settings.connect(`changed::${this._KEY_KEYBOARD_MODEL}`, this._emitKeyboardModelChanged.bind(this));
         this._settings.connect(`changed::${this._KEY_PER_WINDOW}`, this._emitPerWindowChanged.bind(this));
     }
 
@@ -306,6 +322,10 @@ class InputSourceSessionSettings extends InputSourceSettings {
         return this._settings.get_strv(this._KEY_KEYBOARD_OPTIONS);
     }
 
+    get keyboardModel() {
+        return this._settings.get_string(this._KEY_KEYBOARD_MODEL);
+    }
+
     get perWindow() {
         return this._settings.get_boolean(this._KEY_PER_WINDOW);
     }
@@ -347,6 +367,7 @@ export class InputSourceManager extends Signals.EventEmitter {
             this._settings = new InputSourceSessionSettings();
         this._settings.connect('input-sources-changed', this._inputSourcesChanged.bind(this));
         this._settings.connect('keyboard-options-changed', this._keyboardOptionsChanged.bind(this));
+        this._settings.connect('keyboard-model-changed', this._keyboardModelChanged.bind(this));
 
         this._xkbInfo = KeyboardManager.getXkbInfo();
         this._keyboardManager = KeyboardManager.getKeyboardManager();
@@ -371,6 +392,7 @@ export class InputSourceManager extends Signals.EventEmitter {
     reload() {
         this._reloading = true;
         this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions);
+        this._keyboardManager.setKeyboardModel(this._settings.keyboardModel);
         this._inputSourcesChanged();
         this._reloading = false;
     }
@@ -435,6 +457,11 @@ export class InputSourceManager extends Signals.EventEmitter {
         this._keyboardManager.reapply();
     }
 
+    _keyboardModelChanged() {
+        this._keyboardManager.setKeyboardModel(this._settings.keyboardModel);
+        this._keyboardManager.reapply();
+    }
+
     _updateMruSettings() {
         // If IBus is not ready we don't have a full picture of all
         // the available sources, so don't update the setting